<?php
/**
 * Notes: 单例模式，此处展示了懒汉模式和饿汉模式，至于线程安全，后续有时间或者面试到了再说
 * User: lhz
 * DateTime: 2025/7/10 22:55
 */
// 懒汉模式
class SingletonPattern
{
    // 单例实例存储变量
    private static $instance;

    // 静态方法获取单例对象
    public static function getInstance()
    {
        // 如果实例不存在，则创建一个新的实例
        if (self::$instance === null) {
            echo "1单例对象不存在，创建单例对象，返回单例对象";
            self::$instance = new self();
        } else {
            echo "\n";
            echo "2单例对象已存在，直接返回单例对象";
        }
        return self::$instance;
    }

    // 私有构造函数，防止外部直接实例化
    private function __construct()
    {
    }
}

$instance1 = SingletonPattern::getInstance();
$instance2 = SingletonPattern::getInstance();

// 输出结果，$instance1 和 $instance2 相等则是同一个对象，单例模式成功
echo "\n";
var_dump($instance1 === $instance2);

// 饿汉模式，其实就是将单例对象提前创建好，然后直接返回
class SingletonPattern2 {
    private static $instance = null;
    public static function getInstance() {
        return self::$instance;
    }
    private function __construct() {
    }
    private function __clone() {
    }
    public static function init() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}
// 直接调用静态方法初始化单例对象
$instance3 = SingletonPattern2::init();
// 后续获取的单例对象就是之前初始化的
$instance4 = SingletonPattern2::getInstance();

echo "\n";
var_dump($instance3 === $instance4);

// TODO 线程安全